<?php
//рус
include_once (_CORE_PATH . "module/active_module.php");
class module_collection
{
    /**
		список доступных модулей
     */
    private $_moduleList = array();
    /**
		список контроллеров для модулей
     */
    private $_ctrlList = array();
    /**
		список5 экшенов для контроллеров
     */
    private $_ctrlActionList = array();
    private $_isModuleListLoaded = false;
    private static $_instance;
    protected function __construct ()
    {}
    static public function GetInstance ()
    {
        if (! (self::$_instance instanceof self))
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
		загружает список модулей, доступных системе
     */
    private function LoadModuleList ()
    {
        if ($this->_isModuleListLoaded)
            return $this;
        $this->_isModuleListLoaded = true;
        //загружаем список модулей
        if (is_file(_APP_PATH . 'modules/modules.php'))
        {
            $this->_moduleList = include (_APP_PATH . 'modules/modules.php');
        }
        else 
        {
            $this->_moduleList = array();
        }
        
        return $this;
    }
    /**
		возвращает список модулей
     */
    public function GetModuleList ()
    {
        $this->LoadModuleList();
        return $this->_moduleList;
    }
    /**
		загружаем список контроллеров для модуля
     */
    public function GetCtrlList ($moduleName)
    {
        if (!$this->IsModuleInList ($moduleName)) return array();
        
        if (! isset($this->_ctrlList[$moduleName])) {
            //загружаем список контроллеров
            if (is_file($this->GetModulePath($moduleName) . 'controllers/controllers.php'))
            {
                $this->_ctrlList[$moduleName] = include ($this->GetModulePath($moduleName) . 'controllers/controllers.php');
            }   
            else 
            {
                $this->_ctrlList[$moduleName] = array();
            }     
        }
        return $this->_ctrlList[$moduleName];
    }
    public function IsCtrlInList ($moduleName, $ctrlName)
    {
        $this->GetCtrlList($moduleName);
        return isset($this->_ctrlList[$moduleName][$ctrlName]);
    }
    /**
		возвращает данные контроллера по его имени
     */
    public function GetCtrlDetails ($moduleName, $ctrlName)
    {
        if (! $this->IsCtrlInList($moduleName, $ctrlName)) return array(
		                                                                'id' => 0,
		                                                                'title' => '',
		                                                        );
        return $this->_ctrlList[$moduleName][$ctrlName];
    }
    /**
		список экшенов для контроллера
     */
    public function GetCtrlActionList ($moduleName, $ctrlName)
    {
        if (! $this->IsCtrlInList($moduleName, $ctrlName)) return array();
        
        if (! isset($this->_ctrlActionList[$moduleName][$ctrlName])) {
            $ctrlPath = SysLoader::GetCtrlPath($moduleName, $ctrlName);
            if (is_file($ctrlPath . 'actions.php'))
                $this->_ctrlActionList[$moduleName][$ctrlName] = include ($ctrlPath . 'actions.php');
            else
                $this->_ctrlActionList[$moduleName][$ctrlName] = array();
        }
        return $this->_ctrlActionList[$moduleName][$ctrlName];
    }
    
    public function IsActionInList($moduleName, $ctrlName, $actionName)
    {
        $this->GetCtrlActionList($moduleName, $ctrlName);
        return isset($this->_ctrlActionList[$moduleName][$ctrlName][$actionName]);
    }    
    
    public function GetActionDetails($moduleName, $ctrlName, $actionName)
    {
        if (! $this->IsActionInList($moduleName, $ctrlName, $actionName)) return array(
		                                                                'id' => 0,
		                                                                'title' => '',
		                                                        );
        return $this->_ctrlActionList[$moduleName][$ctrlName][$actionName];    	
    }    
    
    /**
		проверяем есть ли модуль в списке модулей
     */
    public function IsModuleInList ($moduleName)
    {
        $this->LoadModuleList();
        return $moduleName && isset($this->_moduleList[$moduleName]);
    }
    /**
		возвращает данные модуля из спика модулей
     */
    public function GetModuleDetails ($moduleName)
    {
        if (! $this->IsModuleInList($moduleName)) return array(
                                                                'id' => 0,
                                                                'title' => '',
                                                        );
        return $this->_moduleList[$moduleName];
    }
    public function GetModuleId ($moduleName)
    {
        if (! $this->IsModuleInList($moduleName)) return 0;
        return $this->_moduleList[$moduleName]['id'];
    }
    public function GetModuleTitle ($moduleName)
    {
        if (! $this->IsModuleInList($moduleName)) return '';
        return $this->_moduleList[$moduleName]['title'];
    }
    public function GetModulePath ($moduleName)
    {
        return _APP_PATH . 'modules/' . $moduleName . '/';
    }
    public function GetModuleFolder ($moduleName)
    {
        return 'modules/' . $moduleName . '/';
    }
    /**
		возвращает объект модуля
     */
    public function GetModule ($moduleName, $protName, $envName, $user = null)
    {
        if (! $this->IsModuleExists($moduleName, $protName, $envName)) throw new Exception('Модуль ' . $moduleName . ' не найден');

        include_once($this->GetModulePath($moduleName). 'module/module_' .$moduleName. '_' .$protName.$envName. '.php');
        
        $moduleClassName = 'module_' .$moduleName. '_' .$protName.$envName;
        return new $moduleClassName($moduleName, $user);
    }
    
    public function IsModuleExists($moduleName, $protName, $envName)
    {
        return is_file($this->GetModulePath($moduleName). 'module/module_' .$moduleName. '_' .$protName.$envName. '.php');        
    }
}